package com.vdong.redis.data.core.json.ops;

import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.ScanOptions;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * ops覆盖接口，用于动态代理
* @author <a href="mailto:zhudelie@zuozh.com">zhudelie</a>
* @version 
* @since JDK 1.6
* create on 2017年3月31日
* Copyright 2017 ZZJR All Rights Reserved.
*
*/
public interface FastJsonBoundSetOperations<K,V> extends BoundSetOperations<K,V> {
	
	/**
	 * 得到当前key
	 */
	
	K getKey();
	/**
	 * 得到当前存储类型
	 */
	
	DataType getType();
	/**
	 * 得到过期时间
	 */
	
	Long getExpire();
	/**
	 * 设置过期时间
	 */
	
	Boolean expire(long timeout, TimeUnit unit);
	/**
	 * 设置过期日期
	 */
	
	Boolean expireAt(Date date);
	/**
	 * 取消过期时间
	 */
	
	Boolean persist();
	/**
	 * key重命名
	 */
	
	void rename(K newKey);
	/**
	 * 添加多个值
	 */
	
	Long add(V... values);
	/**
	 * 删除多个值
	 */
	
	Long remove(Object... values);
	/**
	 * 随机删除并返回一个元素
	 */
	
	V pop();
	/**
	 * 将 member 元素从 source 集合移动到 destination 集合。
	 */
	
	Boolean move(K destKey, V value);
	/**
	 * 数量
	 */
	
	Long size();
	/**
	 * 是否为集合中的一个元素
	 */
	
	Boolean isMember(Object o);
	/**
	 * 与给定所有给定key的交集。 不存在的集合 key 被视为空集。 当给定集合当中有一个空集时，结果也为空集(根据集合运算定律)
	 */
	
	Set<V> intersect(K key);
	/**
	 * 给定所有给定集合的交集。 不存在的集合 key 被视为空集。 当给定集合当中有一个空集时，结果也为空集(根据集合运算定律)
	 */
	
	Set<V> intersect(Collection<K> keys);
	/**
	 * 命令将给定集合之间的交集存储在指定的key。如果指定的key已经存在，则将其覆盖。
	 */
	
	void intersectAndStore(K key, K destKey);
	/**
	 * 命令将给定集合之间的交集存储在指定的key中。如果指定的key已经存在，则将其覆盖。
	 */
	
	void intersectAndStore(Collection<K> keys, K destKey);
	/**
	 * 命令返回给定集合的并集。不存在的集合 key 被视为空集。
	 */
	
	Set<V> union(K key);
	/**
	 * 命令返回给定集合的并集。不存在的集合 key 被视为空集。
	 */
	
	Set<V> union(Collection<K> keys);
	/**
	 * 命令返回给定集合的并集并储存在指定key中。如果指定的key已经存在，则将其覆盖。
	 */
	
	void unionAndStore(K key, K destKey);
	/**
	 * 命令返回给定集合的并集并储存在指定key中。如果指定的key已经存在，则将其覆盖。
	 */
	
	void unionAndStore(Collection<K> keys, K destKey);
	/**
	 * 命令返回给定集合之间的差集。不存在的集合 key 将视为空集
	 */
	
	Set<V> diff(K key);
	/**
	 * 命令返回给定集合之间的差集。不存在的集合 key 将视为空集
	 */
	
	Set<V> diff(Collection<K> keys);
	/**
	 * 命令返回给定集合之间的差集并存在指定key中。如果指定的key已经存在，则将其覆盖。
	 */
	
	void diffAndStore(K keys, K destKey);
	/**
	 * 命令返回给定集合之间的差集并存在指定key中。如果指定的key已经存在，则将其覆盖。
	 */
	
	void diffAndStore(Collection<K> keys, K destKey);
	/**
	 * 获得所有元素
	 */
	
	Set<V> members();
	/**
	 * 随意获得一个集合元素
	 */
	
	V randomMember();
	/**
	 *  随机获取count个不重复的元素
	 */
	
	Set<V> distinctRandomMembers(long count);
	/**
	 *  随机获取count个元素
	 */
	
	List<V> randomMembers(long count);

	
	Cursor<V> scan(ScanOptions options);

	
	RedisOperations<K,V> getOperations();
	
}
